package org.lestr.secuel.noyau.systemeLogique.conditions;

import org.jdom.Attribute;
import org.jdom.Element;

import org.lestr.secuel.m3ds.objets3D.Objet3D;
import org.lestr.secuel.m3ds.objets3D.Objet3DCollisionEcouteur;
import org.lestr.secuel.noyau.sauvegarde.NoyauEnregistreur;
import org.lestr.secuel.noyau.sauvegarde.NoyauLecteur;

public class ConditionCollision extends ConditionAbstraite {

	
	// Définition de constantes
	private static final long serialVersionUID = 1L;

	
	// Déclaration des attributs
	private Objet3D objet1;
	private Objet3D objet2;
	private Objet3DCollisionEcouteur écouteur;
	
	
	/** Constructeur */
	public ConditionCollision(){
		
		// Instanciation des attributs
		objet1 = null;
		objet2 = null;
		écouteur = null;
		
		// Défini le nom de la collision
		setTypeNom("Collision");
		
		// Initialise l'écouteur
		écouteur = new Objet3DCollisionEcouteur(){

			
			/** Signal un début de collision entre deux objets */
			public void débutCollision(Objet3D origine, Objet3D étranger){
				
				// Si les objet sont les bons
				if((objet1 == origine && objet2 == étranger) || (objet2 == origine && objet1 == étranger)){
					
					vraie();
					
				}
				
			}// FIN débutCollision

			
			/** Signal une fin de collision entre deux objets */
			public void finCollision(Objet3D origine, Objet3D étranger){
				
				// Si les objet sont les bons
				if((objet1 == origine && objet2 == étranger) || (objet2 == origine && objet1 == étranger)){
					
					fausse();
					
				}
				
			}// FIN finCollision
			
		};
		
	}// FIN Constructeur
	
	
	/** Défini l'objet1 */
	public void setObjet1(Objet3D objet){
	
		// Supprime les écouteurs sur l'ancien
		if(objet1 != null)
			objet1.retraitCollisionEcouteur(écouteur);
		
		// Mémorise
		objet1 = objet;
		
		// Ajoute un écouteur de collsion à l'objet
		objet.ajoutCollisionEcouteur(écouteur);
		
	}// FIN defObjet1
	
	
	/** Retourne l'objet 1 */
	public Objet3D getObjet1(){
		
		return objet1;
		
	}// FIN retObjet1
	
	
	/** Défini l'objet2 */
	public void setObjet2(Objet3D objet){
	
		// Supprime les écouteurs sur l'ancien
		if(objet2 != null)
			objet2.retraitCollisionEcouteur(écouteur);
		
		// Mémorise
		objet2 = objet;
		
		// Ajoute un écouteur de collsion à l'objet
		objet.ajoutCollisionEcouteur(écouteur);
		
	}// FIN defObjet2
	
	
	/** Retourne l'objet 2 */
	public Objet3D getObjet2(){
		
		return objet2;
		
	}// FIN retObjet2


	@Override
	public void charger(Element xml) {
		
		// Récupère le nom des objets 1 et 2
		String objet1Nom = xml.getAttributeValue("nom", NoyauLecteur.espaceDeNommage);
		String objet2Nom = xml.getAttributeValue("nom", NoyauLecteur.espaceDeNommage);
		
		// Récupère l'objet 1
		for(Objet3D objet : getSystèmeLogique().getUnivers().getObjets3D())
			if(objet.getNom().equals(objet1Nom))
				setObjet1(objet);
		
		// Récupère l'objet 2
		for(Objet3D objet : getSystèmeLogique().getUnivers().getObjets3D())
			if(objet.getNom().equals(objet2Nom))
				setObjet2(objet);
		
	}// FIN charger


	@Override
	public Element compiler() {
		
		// Variables locales
		Element rslt = new Element(getTypeNom(), NoyauEnregistreur.espaceDeNommage);
		
		// Mémorise les objets
		rslt.setAttribute(new Attribute("objet1", objet1.getNom(), NoyauEnregistreur.espaceDeNommage));
		rslt.setAttribute(new Attribute("objet2", objet1.getNom(), NoyauEnregistreur.espaceDeNommage));
		
		// Retourne le résultat
		return rslt;
		
	}// FIN compiler
	
	
}// FIN Classe
